System.Drawing
void Main()
{
var input = File.ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "..", "day7.txt"));
var re = new Regex(@"^([^ ]+) \((\d+)\)( -> (([^, ]+(, )?)+))?");
var programs = input.Select(i => re.Match(i))
.ToDictionary(m => m.Groups[1].Value, m => new Program
{
Weight = int.Parse(m.Groups[2].Value),
Holding = m.Groups[4].Value.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries).ToArray()
});
// part1
var part1 = programs.Single(p => !programs.Any(pr => pr.Value.Holding.Contains(p.Key))).Key;
part1.Dump();
// part 2
var unbalanced = programs.Values
.Where(p => p.Holding.Select(h => programs[h].TotalWeight(programs)).Distinct().Count() > 1)
.OrderBy(p => p.TotalWeight(programs))
.First()
.Holding.Select(h => programs[h]);
var stacks = unbalanced.GroupBy(u => u.TotalWeight(programs)).OrderBy(u => u.Count()).Select(u => u.First()).ToArray();
var part2 = stacks[0].Weight + (stacks[1].TotalWeight(programs) - stacks[0].TotalWeight(programs));
part2.Dump();
}
class Program
{
public int Weight { get; set; }
public string[] Holding { get; set; }
public int TotalWeight(Dictionary programs) => Weight + Holding.Sum(h => programs[h].TotalWeight(programs));
}